package cineplanet.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import javax.sql.DataSource;

import cineplanet.excepcion.DAOExcepcion;
import cineplanet.modelo.Cine;
import cineplanet.modelo.Pelicula;

public class CineDAOImpl extends BaseDAO implements CineDAO {
	private DataSource dataSource;

	public DataSource getDataSource() {
		return dataSource;
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public Cine insertar(Cine vo) throws DAOExcepcion {
		String query = "INSERT INTO cineplanet.cine(nombre,direccion,estado) VALUES (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre());
			stmt.setString(2, vo.getDireccion());
			stmt.setByte(3, vo.getEstado());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			} // Obtener el ultimo id
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdCine(rs.getInt(1));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int idCine) throws DAOExcepcion {
		String query = "DELETE FROM cineplanet.cine WHERE idCine=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idCine);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Cine actualizar(Cine vo) throws DAOExcepcion {
		// Actualizar los campos para la actualizacion
		String query = "update cineplanet.cine set nombre=?,direccion=?,estado=? where idCine=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre());
			stmt.setString(2, vo.getDireccion());
			stmt.setByte(3, vo.getEstado());
			stmt.setInt(4, vo.getIdCine());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	@Override
	public Collection<Cine> listar() throws DAOExcepcion {
		Collection<Cine> c = new ArrayList<Cine>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = dataSource.getConnection();
			String query = "SELECT idCine,nombre,direccion,estado from cineplanet.cine c";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cine vo = new Cine();
				vo.setIdCine(rs.getInt("idCine"));
				vo.setNombre(rs.getString("nombre"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setEstado(rs.getByte("estado"));
				c.add(vo);
				System.err.println(vo);

			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Cine obtener(int idCine) throws DAOExcepcion {
		Cine vo = new Cine();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idCine, nombre,direccion,estado from cineplanet.cine where idCine=?";
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idCine);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdCine(rs.getInt("idCine"));
				vo.setNombre(rs.getString("nombre"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setEstado(rs.getByte("estado"));
				System.err.println(vo);

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
}
